package abg.core.service.mt;

import abg.core.common.message.RedisMsgType;
import abg.core.domain.db.MtRoom;
import abg.core.domain.db.MtRoomUserAuth;
import abg.core.domain.db.SysUser;
import abg.core.domain.search.Psh;
import abg.core.domain.sys.SRS;
import com.mybatisflex.core.paginate.Page;

import java.util.List;

/**
 * 会议室内部逻辑
 */
public interface MtLiveRoomService {

    //当前房间信息
    MtRoom roomInfo(String mtId);

    //申请连麦
    boolean applyTop(String mtId);

    //同意连麦
    boolean agreeTop(String userId, String mtId);

    //生成房间推流
    String createRtmpUrlAndSaveToken(String mtId, String userId, Long liveSecond);

    //检查推流地址
    boolean checkRtmpByCacheToken(String mtId, String userId, String tokenKey);

    //拒绝连麦
    boolean refuseTop(String userId, String mtId, boolean mastCompere);

    //连麦列表
    List<MtRoomUserAuth> topList(String mtId);

    //我的权限信息
    MtRoomUserAuth myAuth(String mtId);

    boolean outTop(String userId, String mtId);

    void userInRoom(String mtId);

    boolean closeMtRoom(String mtId);

    Page<MtRoomUserAuth> applyTopPage(String mtId, String key, Psh psh);

    Page<MtRoomUserAuth> roomUserPage(String mtId, String key, String type, Psh psh);

    //踢出会议/允许参会
    boolean updateMtUserInOut(String userId, String mtId, String type);

    //允许发言/禁止发言
    boolean updateMtUserMsg(String userId, String mtId, String type);

    //全局禁言/允许发言
    boolean updateAllAccessMsg(String mtId, String type);

    //会议内发消息
    void liveRoomSendMsg(String mtId, String msg, Integer time);

    //进出会议消息
    void liveRoomSendInOutMsg(String mtId, String type);

    void updateNickName(String mtId, String nickName);

    //修改房间标题
    boolean updateRoomTitle(String mtId, String title);

    //修改我在会议内容的昵称
    boolean updateMyNickName(String mtId, String nickName);

    //修改我在会议内容的头像
    boolean updateMyNickAvatar(String mtId, String nickAvatar);

    /**
     * 修改会议内麦克风状态
     *
     * @param status 1=开麦 0=关麦
     */
    boolean updateMyAudio(String mtId, String status);

    void zan(String mtId);

    //用户主动退出连麦
    void outMyTop(String mtId);

    //根据完整的用户信息，关闭用户存在的会议
    boolean closeMtRoomByUser(SysUser sysUser, RedisMsgType redisMsgType);


    //通知房间内所有人
    void wsSendMtAll(String mtId, SRS<Object> msgBody);

    //通知某一个人
    void wsSendMtUser(String userId, SRS<Object> msgBody);

    /**
     * 发送房间消息
     *
     * @param mtId             会议ID
     * @param sendUserId       发送人ID；传0为系统用户
     * @param sendMsg          发送消息
     * @param msgShowTimeMilli 消息显示时间；前端页面显示的时间
     */
    void wsMtRoomMsg(String mtId, String sendUserId, String sendMsg, Integer msgShowTimeMilli);

    //    通知用户被踢出房间
    void wsOutUserMsg(String mtId, String outUserId);

    //    通知用户上麦状态
    void wsUserTopStatus(String mtId, String userId, String status);

    //刷新我的会议室内信息
    void wsRefreshMyInfo(String mtId, String userId);

    //    通知用户禁言状态
    void wsUserMsgStatus(String mtId, String userId, String status);

    //  通知房间禁言
    void wsRoomMsgStatus(String mtId, String status);

    //通知房间内用户，房间已关闭
    void wsMtRoomClose(String mtId);

    //通知房主有人申请上麦
    void wsApplyTopMsg(String applyUserId, String mtId);

    void wsRefreshTopList(String mtId);

    void wsSearchRoomUser(String mtId);

    void wsRefreshRoomInfo(String mtId);
}
